package com.redepronik.negosysres.invfac.report;

import static com.redepronik.negosys.utils.Utils.multiplicar;
import static com.redepronik.negosys.utils.Utils.newBigDecimal;
import static com.redepronik.negosys.utils.Utils.valorConPorcentaje;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.faces.event.ActionEvent;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

import com.redepronik.negosys.invfac.entity.Bodega;
import com.redepronik.negosys.invfac.entity.Kardex;
import com.redepronik.negosys.invfac.entity.Producto;
import com.redepronik.negosys.invfac.entity.TipoPrecioProducto;
import com.redepronik.negosys.invfac.entityAux.InversionBodegaReporte;
import com.redepronik.negosys.invfac.entityAux.InversionBodegasReporte;
import com.redepronik.negosys.invfac.service.BodegaService;
import com.redepronik.negosys.invfac.service.KardexService;
import com.redepronik.negosys.invfac.service.ProductoService;
import com.redepronik.negosys.utils.service.ReporteService;

@Controller
public class BodegaReport {

	@Autowired
	private ReporteService reporteService;

	@Autowired
	private ProductoService productoService;

	@Autowired
	private KardexService kardexService;

	@Autowired
	private BodegaService bodegaService;

	private List<Producto> listProductos;
	private String nombreProducto;
	private Producto producto;
	private Bodega bodega;

	public BodegaReport() {
		listProductos = new ArrayList<Producto>();
		producto = new Producto();
		bodega = new Bodega();
	}

	public Bodega getBodega() {
		return bodega;
	}

	public List<Producto> getListProductos() {
		return listProductos;
	}

	public String getNombreProducto() {
		return nombreProducto;
	}

	public Producto getProducto() {
		return producto;
	}

	public InversionBodegaReporte metodo(Producto producto, Bodega bodega) {
		Kardex kardex = kardexService.obtenerSaldoActual(producto.getEan(),
				bodega.getBodegaid());
		if (kardex != null && kardex.getCantidad() > 0) {
			int cantidad = kardex.getCantidad();

			TipoPrecioProducto tpp = productoService.obtenerValorPvp(producto
					.getTipoPrecioProductos());

			if (tpp == null)
				tpp = producto.getTipoPrecioProductos().size() >= 2 ? producto
						.getTipoPrecioProductos().get(1) : producto
						.getTipoPrecioProductos().get(0);

			BigDecimal preciouniventa = tpp.getPorcentajepreciofijo() ? valorConPorcentaje(
					kardex.getPrecio(), tpp.getValor()) : tpp.getValor();

			return new InversionBodegaReporte(producto.getEan(),
					producto.getNombreimprimir(), cantidad, kardex.getPrecio(),
					multiplicar(kardex.getPrecio(), cantidad), preciouniventa,
					multiplicar(preciouniventa, cantidad));
		} else
			return null;
	}

	public void obtenerProducto() {
		producto = productoService.obtenerPorProductoId(producto
				.getProductoid());
	}

	public void obtenerProductos() {
		if (!nombreProducto.equals(null) && bodega.getBodegaid() != 0)
			listProductos = productoService.obtenerPorEanAndBodega(
					nombreProducto, bodega.getBodegaid());
	}

	public void reporteInversionBodega(ActionEvent actionEvent) {
		if (bodega.getBodegaid() != 0) {
			bodega = bodegaService.obtenerPorBodegaId(bodega.getBodegaid());
			List<InversionBodegaReporte> list = new ArrayList<InversionBodegaReporte>();
			if (producto == null)
				for (Producto producto : productoService
						.obtenerPorBodega(bodega.getBodegaid())) {
					InversionBodegaReporte ibr = metodo(producto, bodega);
					if (ibr != null)
						list.add(ibr);
				}
			else {
				InversionBodegaReporte ibr = metodo(producto, bodega);
				if (ibr != null)
					list.add(ibr);
				producto = null;
			}

			Map<String, Object> parametros = new HashMap<String, Object>();
			parametros.put("bodega", bodega.getNombre());
			reporteService.generarReportePDF(list, parametros,
					"InversionBodega");
		}
		bodega = new Bodega();
	}

	public void reporteInversionBodegas(ActionEvent actionEvent) {
		List<InversionBodegasReporte> list = new ArrayList<InversionBodegasReporte>();
		for (Bodega bodega : bodegaService.obtener()) {

			BigDecimal preciototalcompra = newBigDecimal();
			BigDecimal preciototalventa = newBigDecimal();

			for (Producto producto : productoService.obtenerPorBodega(bodega
					.getBodegaid())) {
				InversionBodegaReporte ibr = metodo(producto, bodega);
				if (ibr != null) {
					preciototalcompra = preciototalcompra.add(ibr
							.getPreciototalcompra());
					preciototalventa = preciototalventa.add(ibr
							.getPreciototalventa());
				}
			}

			list.add(new InversionBodegasReporte(bodega.getBodegaid(), bodega
					.getNombre(), preciototalcompra, preciototalventa));
		}
		Map<String, Object> parametros = new HashMap<String, Object>();
		reporteService.generarReportePDF(list, parametros, "InversionBodegas");
	}

	public void setBodega(Bodega bodega) {
		this.bodega = bodega;
	}

	public void setListProductos(List<Producto> listProductos) {
		this.listProductos = listProductos;
	}

	public void setNombreProducto(String nombreProducto) {
		this.nombreProducto = nombreProducto;
	}

	public void setProducto(Producto producto) {
		this.producto = producto;
	}
}